package com.wanter.common.login.validate;

import com.wanter.common.login.entity.Token;
import com.wanter.users.entity.User;
import org.apache.log4j.Logger;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 密码机制的帮助类
 * Created by er on 2017/7/10.
 */
public class TokenHelper {
    //防止多线程访问的时候出现线程安全问题
    private static Map<String, Token> map = new ConcurrentHashMap<>();

    private static final Logger logger = Logger.getLogger(TokenHelper.class);
    /**
     * 登录有效时间
     */
    private static final Long VALIDATE_TIME_30_MIN_TO_SECCOUND = 1000 * 60 * 30L;


    /**
     * 存贮一个新的用户
     *
     * @param token 密保机制
     * @param user  用户
     */
    public static String put(Token token, User user) {
        Token tempToken = map.get(user.getId());
        if (tempToken == null) {
            if (logger.isInfoEnabled()) {
                logger.info("用户" + user + "已经成功登录");
                return "success:用户" + user.getUsername() + "成功登录";
            }
            map.put(user.getId(), token);
        } else {
            logger.error("当前用户" + user + "已经被登录了");
            return "error:当前用户已经被登录了";
        }

        return "error:" + user.getUsername() + "登录失败";
    }

    /**
     * 移除掉一个token
     *
     * @param token 被移除的token
     */
    public static void remove(Token token) {
        if (map != null && map.size() > 0) {
            if (map.containsValue(token)) {
                map.remove(token);
            }

        }
        return;
    }

    /**
     * 判断当前的token是否已经登录了
     *
     * @param token 验证的token
     * @return 存在 true 否则false
     */
    public static boolean isExit(Token token) {
        check(token);
        if (map != null && map.size() > 0) {
            return map.containsValue(token);
        }
        return false;
    }


    /**
     * 判断当前的token是否已经登录了
     *
     * @param userId 验证的token
     * @return 存在 true 否则false
     */
    public static boolean isExitUserId(String userId) {
        if (map != null && map.size() > 0) {
            return map.containsKey(userId);
        }
        return false;
    }

    /**
     * 根据tokenId验证当前的tokenId是否有效
     *
     * @param tokenId tokenId
     * @return 存在就true
     */
    public static boolean isExitTokenId(String tokenId) {
        if (map != null && map.size() > 0) {
            Set<String> keySet = map.keySet();
            for (String key : keySet) {
                Token token = map.get(key);
                if (token.getTokenId().equals(tokenId)) {
                    return true;
                }
            }


        }
        return false;
    }


    /**
     * 自动移除当前过期用户
     * 目前设置的是30分钟时间就为过期
     */
    public static void autoRemove() {
        if (map != null && map.size() > 0) {
            Set<String> keySet = map.keySet();
            for (String key : keySet) {
                Token token = map.get(key);
                if (token != null && token.getLoginDate() != null) {
                    if (System.currentTimeMillis() - token.getLoginDate().getTime() > VALIDATE_TIME_30_MIN_TO_SECCOUND) {
                        remove(token);
                    }
                }
            }
        }
    }

    /**
     * 检查当前的token是否过期了
     *
     * @param token token
     */
    private static void check(Token token) {
        if (System.currentTimeMillis() - token.getLoginDate().getTime() > VALIDATE_TIME_30_MIN_TO_SECCOUND) {
            remove(token);
        }
    }

    /**
     * 根据用户的id来更新token
     *
     * @param userId userId
     */
    public static void updateTokenByuserId(String userId) {
        if (map != null && map.size() > 0) {
            Token token = map.get(userId);
            if (token != null) {
                token.setLoginDate(new Date());
                map.put(userId, token);

            }
        }
    }

    /**
     * 根据tokenId更新tonken
     *
     * @param tokenId tokenId
     */
    public static void updateTokenBytokenId(String tokenId) {
        if (map != null && map.size() > 0) {
            Set<String> keySet = map.keySet();
            for (String key : keySet) {
                Token token = map.get(key);
                if (token != null && token.getLoginDate() != null) {
                    token.setLoginDate(new Date());
                    map.put(key, token);
                }
            }


        }
    }

    /**
     * 根据tokenId拿到token
     * @param tokenId tokenId
     * @return Token
     */
    public static Token getTokenBytokenId(String tokenId) {
        if (map != null && map.size() > 0) {
            Set<String> keySet = map.keySet();
            for (String key : keySet) {
                Token token = map.get(key);
                if (token != null) {
                    if (token.getTokenId().equals(tokenId)) {
                        return token;
                    }
                }
            }


        }
        return null;
    }

    /**
     * 根据 userId
     * @param userId userId
     * @return Token
     */
    public static Token getTokenBytokenID(String userId){
        if(map!=null&&map.size()>0){
            Token token = map.get(userId);
            if(token!=null){
                return token;
            }
        }
        return null;
    }

}
